package com.dhcc.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dhcc.api.R;
import com.dhcc.entity.SysDept;
import com.dhcc.entity.SysDeptPosition;
import com.dhcc.entity.SysPosition;
import com.dhcc.service.SysDeptPositionService;
import com.dhcc.service.SysPositionService;
import com.dhcc.support.Condition;
import com.dhcc.support.Query;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 岗位管理控制层接口
 * @ProjectName Dhcc-Cloud
 * @PackageName com.dhcc.controller
 * @Title SysPositionController
 * @Date 2024/12/25 20:19
 * @Author LiuGuoting
 */
@RestController
@RequestMapping("/sys/position")
public class SysPositionController {

    @Resource
    private SysPositionService sysPositionService;
    @Autowired
    private SysDeptPositionService sysDeptPositionService;

    /**
     * 分页查询岗位
     *
     * @param sysPosition 岗位信息实体对象
     * @return 分页查询结果
     */
    @GetMapping("/page")
    public R<IPage<SysPosition>> page(SysPosition sysPosition, Query query) {
        return R.data(sysPositionService.page(Condition.getPage(query), sysPosition));
    }

    /**
     * 获取所有岗位列表
     *
     * @return 岗位列表
     */
    @GetMapping("/list")
    public R<List<SysPosition>> list() {
        return R.data(sysPositionService.listAll());
    }

    /**
     * 新增岗位
     *
     * @param sysPosition 岗位信息实体对象
     * @return 操作结果
     */
    @PostMapping("/add")
    public R<Boolean> add(@RequestBody SysPosition sysPosition) {
        return R.status(sysPositionService.addSysPosition(sysPosition), "新增岗位成功");
    }

    /**
     * 查询岗位信息
     *
     * @param positionId 岗位ID
     * @return 岗位信息
     */
    @GetMapping("/detail")
    public R<SysPosition> info(@RequestParam("positionId") String positionId) {
        return R.data(sysPositionService.getSysPositionById(positionId));
    }

    /**
     * 修改岗位信息
     * @param sysPosition 岗位信息实体对象
     * @return 操作结果
     */
    @PostMapping("/update")
    public R<Boolean> update(@RequestBody SysPosition sysPosition) {
        return R.status(sysPositionService.updateSysPosition(sysPosition));
    }

    /**
     * 删除岗位
     *
     * @param params 岗位ID列表
     * @return 操作结果
     */
    @PostMapping("/delete")
    public R<Boolean> delete(@RequestBody Map<String, String> params) {
        // 从Map中获取岗位id值，并转换为Long类型
        String id = params.get("id");
        // 判断该岗位是否被部门使用，如果使用，则不允许删除
        LambdaQueryWrapper<SysDeptPosition> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SysDeptPosition::getPositionId, id);
        int size = sysDeptPositionService.list(lambdaQueryWrapper).size();
        if (size > 0) {
            return R.fail("岗位已被部门使用，请先在已使用该岗位的部门中删除后再尝试删除!");
        }
        List<SysPosition> sysPositionList = sysPositionService.list();
        if (sysPositionList.size() == 1) {
            return R.fail("请至少保留一个岗位!");
        }
        return R.status(sysPositionService.deleteByIdLogic(id));
    }

    /**
     * 批量删除岗位
     * @param ids 部门ID列表
     * @return
     */
    @PostMapping("/deleteBatch")
    public R<Boolean> deleteBatchDept(@RequestBody List<String> ids) {
        for (String id : ids) {
            // 判断该岗位是否被部门使用，如果使用，则不允许删除
            LambdaQueryWrapper<SysDeptPosition> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(SysDeptPosition::getPositionId, id);
            int size = sysDeptPositionService.list(lambdaQueryWrapper).size();
            if (size > 0) {
                return R.fail("岗位:" + id + "已被部门使用，请取消或先在已使用该岗位的部门中删除后再尝试删除!");
            }
        }
        List<SysPosition> sysPositionList = sysPositionService.list();
        if (sysPositionList.size() == ids.size()) {
            return R.fail("请至少保留一个岗位!");
        }
        return R.status(sysPositionService.deleteBatchByIdsLogic(ids), "批量删除岗位成功");
    }


    /**
     * 更改岗位状态
     *
     * @param sysDept 部门ID
     * @return 操作结果
     */
    @PostMapping("/updateStatus")
    public R<Boolean> updateStatus(@RequestBody SysDept sysDept) {
        return R.status(sysPositionService.updateStatus(sysDept.getId(), sysDept.getStatus()), "更改岗位状态成功");
    }

    /**
     * 批量更改岗位状态
     *
     * @param ids 部门ID列表
     * @param newStatus 新状态
     * @return 操作结果
     */
    @PostMapping("/updateStatusBatch")
    public R<Boolean> updateStatusBatch(List<String> ids, int newStatus) {
        return R.status(sysPositionService.updateStatusBatch(ids, newStatus), "批量更改岗位状态成功");
    }
}